function SuperMarket() {}
SuperMarket.prototype.product = "口罩";

function Shop() {}
Shop.prototype = new SuperMarket();

// 实例
let p = new Shop();
// p.product = '111'

console.log(p.__proto__ === Shop.prototype); // true
console.log(p.__proto__ === SuperMarket.prototype); // false

/*
  p.product:先看p这个实例身上是否有这个属性，没有就找p实例的原型对象Shop；
  然而Shop的原型指向的是SuperMarket的实例，从这个SuperMarket实例访问SuperMarket的原型对象，从而找到这个属性;

  
*/
console.log(p.product); // 口罩

let s = new SuperMarket();
console.log(s.__proto__ === SuperMarket.prototype); // true
console.log(new SuperMarket() === new SuperMarket()); // false

console.log(p instanceof Shop); // true
console.log(s instanceof Shop); // false
console.log(s instanceof SuperMarket); // true
console.log(p instanceof SuperMarket); // true

console.log(
  "---------------------------------------------------------------------------------"
);

let F = function () {};
Object.prototype.a = function () {
  console.log("a");
};
Function.prototype.b = function () {
  console.log("b");
};

let f = new F();
f.a(); // a
console.log(f.b); // undefined
console.log(F.prototype.__proto__ === Object.prototype); // true

/* 首先：实例对象里面有__proto__, 原型里面既有prototype,又有__proto__ 这里要注意（prototype也是一个对象，所以prototype他也有__proto__）按照这个逻辑你把图画出来，就发现顺着f这个实例对象的__proto__一直往上找，只能找到Object.prototype.a ，但是找不到Function.prototype.b 一定要自己画出来。 */
